#ifndef CTHREAD_POOL_H
#define CTHREAD_POOL_H

#include <vector>
#include <pthread.h>
#include <atomic>
#include <list>

class CThreadPool {
public:
	//构造函数
	CThreadPool();
	//析构函数
	~CThreadPool();
	bool create(int nThreadNum);	//创建该线程池中的所有线程
	void stopAll();					//使线程池中所有线程退出
	void call();					//来任务了，调一个线程池中线程来处理该消息
	int getMsgRecvCount() { return m_iMsgRecv; }

	void inMsgRecvQueueAndSignal(char* pBuf);	//收到一个完整消息后，入消息队列，并触发线程池中线程来处理该消息

private:
	static void* threadFunc(void* pParam);	//线程函数
	void clearMsgRecvQueue();		//清空消息队列

	//定义线程池中线程结构
	struct ThreadItem {
		pthread_t m_tHandle;
		CThreadPool* m_pThis;
		bool	m_bRunning;
		//构造函数
		ThreadItem(CThreadPool *pPool) : m_pThis(pPool), m_bRunning(false){}
		//析构函数
		~ThreadItem() {}
	};

	static pthread_mutex_t m_pthreadMutex;	//互斥量
	static pthread_cond_t m_pthreadCond;	//条件变量
	static bool m_bShutdown;				//线程退出标志

	int m_iThreadNum;						//要创建的线程数量
	std::atomic<int> m_iRunningThreadNum;	//线程数，运行中的线程数，原子操作
	time_t m_iLastEmgTime;					//上次发生线程不够用[紧急事件]的时间，防止日志报的太频繁

	std::vector<ThreadItem*> m_vecThread;	//线程容器，容器里面就是各个线程了

	//接收消息队列相关
	std::list<char*>	m_lstMsgRecv;		//接收数据消息队列
	int					m_iMsgRecv;			//收消息队列大小
};

extern CThreadPool g_clThreadPool;

#endif